#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
文件处理工具模块
提供文件操作相关的工具函数
"""

import os
from typing import List
from config.settings import SUPPORTED_FORMATS


def is_supported_video_file(file_path: str) -> bool:
    """
    检查文件是否为支持的视频格式
    
    Args:
        file_path: 文件路径
        
    Returns:
        是否为支持的视频格式
    """
    if not os.path.exists(file_path):
        return False
    
    _, ext = os.path.splitext(file_path)
    return ext in SUPPORTED_FORMATS


def get_video_files_from_paths(paths: List[str]) -> List[str]:
    """
    从路径列表中筛选出支持的视频文件
    
    Args:
        paths: 文件路径列表
        
    Returns:
        支持的视频文件路径列表
    """
    video_files = []
    
    for path in paths:
        if os.path.isfile(path) and is_supported_video_file(path):
            video_files.append(path)
        elif os.path.isdir(path):
            # 如果是目录，递归查找视频文件
            for root, dirs, files in os.walk(path):
                for file in files:
                    file_path = os.path.join(root, file)
                    if is_supported_video_file(file_path):
                        video_files.append(file_path)
    
    return video_files


def format_file_size(size_bytes: int) -> str:
    """
    格式化文件大小显示
    
    Args:
        size_bytes: 文件大小（字节）
        
    Returns:
        格式化后的文件大小字符串
    """
    if size_bytes == 0:
        return "0 B"
    
    size_names = ["B", "KB", "MB", "GB", "TB"]
    i = 0
    size = float(size_bytes)
    
    while size >= 1024.0 and i < len(size_names) - 1:
        size /= 1024.0
        i += 1
    
    return f"{size:.2f} {size_names[i]}"


def ensure_directory_exists(directory: str) -> bool:
    """
    确保目录存在，如果不存在则创建
    
    Args:
        directory: 目录路径
        
    Returns:
        是否成功创建或目录已存在
    """
    try:
        if not os.path.exists(directory):
            os.makedirs(directory)
        return True
    except Exception:
        return False


def get_safe_filename(filename: str) -> str:
    """
    获取安全的文件名（移除非法字符）
    
    Args:
        filename: 原始文件名
        
    Returns:
        安全的文件名
    """
    # Windows文件名非法字符
    illegal_chars = '<>:"/\\|?*'
    
    safe_name = filename
    for char in illegal_chars:
        safe_name = safe_name.replace(char, '_')
    
    return safe_name


def calculate_compression_savings(original_size: int, compressed_size: int) -> dict:
    """
    计算压缩节省的空间
    
    Args:
        original_size: 原始文件大小
        compressed_size: 压缩后文件大小
        
    Returns:
        包含节省信息的字典
    """
    if original_size == 0:
        return {
            'saved_bytes': 0,
            'saved_percentage': 0,
            'saved_formatted': '0 B'
        }
    
    saved_bytes = original_size - compressed_size
    saved_percentage = (saved_bytes / original_size) * 100
    
    return {
        'saved_bytes': saved_bytes,
        'saved_percentage': round(saved_percentage, 2),
        'saved_formatted': format_file_size(saved_bytes)
    }
